#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=200005,modval=10007;

int n;
LL w[N];
int fa[N];
vector<int> edges[N];
LL ans=0L,mw=0L;

void dfs(int s){
	if(fa[s]!=0||fa[fa[s]]!=0){
		LL ww=w[s]*w[fa[fa[s]]];
		mw=max(ww,mw);
		ans=(ans+ww*2%modval)%modval;
	};
	LL w1=0,w2=0;
	vector<LL> sonw;
	for(auto u:edges[s]){
		if(u!=fa[s]){
			sonw.emplace_back(w[u]);
			fa[u]=s;
			if(w[u]>w1){
				w2=w1;
				w1=w[u];
			}
			else if(w[u]>w2){
				w2=w[u];
			}
		}
	}
	LL sqr_sum=0,sum0=0;
	if(sonw.size()>=2){
		mw=max(mw,w1*w2);
		for(auto v:sonw){
			sqr_sum=(sqr_sum+v%modval*v%modval)%modval;
			sum0=(sum0+v)%modval;
		}
		ans=(ans+sum0*sum0%modval-sqr_sum+modval)%modval;
	}
	for(auto u:edges[s]){
		if(u!=fa[s]) dfs(u);
	}
}

int main(){
	scanf("%d",&n);
	int s,t;
	for(int i=1;i<n;i++){
		scanf("%d%d",&s,&t);
		edges[s].emplace_back(t);
		edges[t].emplace_back(s);
	}
	for(int i=1;i<=n;i++){
		scanf("%lld",&w[i]);
	}
	fa[1]=0;
	dfs(1);
	printf("%lld %lld",mw,ans);
	return 0;
}
/*
5
1 2
1 3
1 4
1 5
1 4 6 8 10
*/
